home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 12984 / 12984.xpi / chrome / VideoDownloaderToolbar.jar / content / vid.js < prev    next >
Text File  |  2010-01-29  |  39KB  |  1,187 lines

  1. if(!com) var com={};
  2. if(!com.VidBar) com.VidBar={};
  3.  
  4. com.VidBar.Observer = {
  5.     //ChromeBase : "chrome://vidbar/",
  6.  
  7.     registered : false,
  8.     cleanOnQuit : false,
  9.     observe : function(subject, topic, data) {
  10.         //alert("topic = " + topic);
  11.         if (topic == "quit-application-requested") {
  12.             var cancel = subject.QueryInterface(Components.interfaces.nsISupportsPRBool);
  13.             if(cancel==true){
  14.                 com.VidBar.__d("com.VidBar.Observer: shutdown has been cancelled by another component");
  15.                 return;
  16.             }
  17.             var result = com.VidBar.VidDownloader.doCloseCheck();
  18.             if (result.cancel) {
  19.                 com.VidBar.__d("com.VidBar.Observer: cancel shutdown");
  20.                 //alert("com.VidBar.Observer: cancel shutdown");
  21.                 // cancel shutdown
  22.                 cancel.data = true;
  23.                 //alert("com.VidBar.Observer: cancelled shutdown");
  24.             } else {
  25.                 //alert("com.VidBar.Observer: clear list = "+result.clear);
  26.                 if(result.clear){
  27.                     com.VidBar.Observer.cleanOnQuit = true;
  28.                     com.VidBar.VidDownloader.cleanAll();
  29.                 }
  30.             }
  31.         } else if (topic == "quit-application-granted") {
  32.             //alert("com.VidBar.Observer.cleanOnQuit = "+com.VidBar.Observer.cleanOnQuit);
  33.             if(com.VidBar.Observer.cleanOnQuit){
  34.                 com.VidBar.__d("com.VidBar.Observer: clean downloadings");
  35.                 //alert("com.VidBar.Observer: clean downloadings");
  36.                 com.VidBar.VidDownloader.cleanAll();
  37.                 //alert("com.VidBar.Observer: downloadings are cleaned");
  38.             }
  39.             com.VidBar.Observer.unregister();
  40.         } else if  (topic == "em-action-requested") {
  41.             com.VidBar.__d("com.VidBar.Observer: em-action-requested");
  42.              var toolbarId = com.VidBar.Pref.getToolbarId();
  43.              subject.QueryInterface(Components.interfaces.nsIUpdateItem);
  44.             if (subject.id == toolbarId) {
  45.                 if(data == "item-uninstalled") {
  46.                     com.VidBar.__d("com.VidBar.Observer: item-uninstalled");
  47.                     com.VidBar.Pref.clearFirstTime();
  48.                 } else if (data == "item-cancel-action") {
  49.                     com.VidBar.Pref.unsetFirstTime();
  50.                 }else if (data == "item-installed") {
  51.                     com.VidBar.__d("com.VidBar.Observer: item-installed");
  52.                     com.VidBar.Main.checkFirstStart();
  53.                     //com.VidBar.ServerPings.onInstall();
  54.                 }else if (data == "item-upgraded") {
  55.                     com.VidBar.__d("com.VidBar.Observer: item-upgraded");
  56.                     //com.VidBar.Main.setFirstStart();
  57.                     com.VidBar.ServerPings.onInstall();
  58.                 }
  59.             }                
  60.             
  61.         }
  62.     },
  63.     register : function() {
  64.         if(this.registered)
  65.             return;
  66.             
  67.         com.VidBar.__d("com.VidBar.Observer.register");
  68.         var observerService = Components.classes["@mozilla.org/observer-service;1"]
  69.                 .getService(Components.interfaces.nsIObserverService);
  70.  
  71.         observerService.addObserver(this, "quit-application-granted", false);
  72.         observerService.addObserver(this, "quit-application-requested", false);
  73.         observerService.addObserver(this, "em-action-requested", false);
  74.     },
  75.     unregister : function() {
  76.         if(!this.registered)
  77.             return;
  78.             
  79.         com.VidBar.__d("com.VidBar.Observer.unregister");
  80.         var observerService = Components.classes["@mozilla.org/observer-service;1"]
  81.                 .getService(Components.interfaces.nsIObserverService);
  82.  
  83.         observerService.removeObserver(this, "quit-application-granted");
  84.         observerService.removeObserver(this, "quit-application-requested");
  85.         observerService.removeObserver(this, "em-action-requested");
  86.     }
  87. };
  88.  
  89. com.VidBar.UI = {
  90.     toolbarDownloadButton : null,
  91.     toolbarSysMenu : null,
  92.     toolbarDownloadMenu : null,
  93.  
  94.     navToolbarButton : null,
  95.     navToolbarContextMenu : null,
  96.     navToolbarDownloadMenu : null,
  97.     
  98. //    statusbarButton : null,
  99. //    statusbarMenu : null,
  100. //    statusbarContextMenu : null,
  101.     
  102. //    toolsMenu : null,
  103.     contextMenu : null,
  104.  
  105.     autofill : null,
  106.     
  107.     init : function(pref) {
  108.         com.VidBar.__d("com.VidBar.UI.init");
  109.         this.pref = pref;
  110.         this.pref.registerObserver(["show-in-context-menu", "icon-pos", "layout-type"], this);
  111.  
  112.         this.install();
  113.         
  114.         this.toolbarDownloadButton = document.getElementById("vidbar-download-button");
  115.         this.toolbarSysMenu = this.initSystemMenu("vidbar-sys-menupopup");
  116.         this.toolbarDownloadMenu = document.getElementById("vidbar-download-menupopup");
  117.         
  118.         this.navToolbarButton = document.getElementById("vidbtn-toolbar-button");
  119.         this.navToolbarContextMenu = this
  120.                 .initSystemMenu("vidbtn-toolbar-ctxmenupopup");
  121.         this.navToolbarDownloadMenu = document.getElementById("vidbtn-download-menupopup");
  122.  
  123. //        this.statusbarButton = document.getElementById("vidbar-statusbar-button");
  124. //        this.statusbarMenu = document.getElementById("vidbar-statusbar-menupopup");
  125. //        this.statusbarContextMenu = this
  126. //                .initSystemMenu("vidbar-statusbar-ctxmenupopup");
  127.         
  128. //        this.toolsMenu = this.initSystemMenu("vidbar-toolsmenupopup");
  129.         this.contextMenu = this.initSystemMenu("vidbar-ctxmenupopup");
  130.  
  131.         this.updateContextMenu();
  132.         this.updateLayout();
  133. //        this.updateIconPos();
  134. //        this.autofill = new com.VidBar.AutoFill();
  135.     },
  136.     observePref : function(data) {
  137.         if (data == "show-in-context-menu")
  138.             this.updateContextMenu();
  139.         else if (data == "layout-type")
  140.             this.updateLayout();
  141. //        else if (data == "icon-pos")
  142. //            this.updateIconPos();
  143.     },
  144.     initSystemMenu : function(id) {
  145.         var menu = document.getElementById(id);
  146.         this.clearMenu(menu);
  147.         this.generateSystemMenu(menu);
  148.         return menu;
  149.     },
  150.     install : function() {
  151.         com.VidBar.__d("com.VidBar.UI.install");
  152.         try {
  153.             var vidId = "vidbtn-toolbaritem";
  154.             var afterId = "urlbar-container";
  155.             var afterElem = document.getElementById(afterId);
  156.             if (afterElem) {
  157.                 var navBar = afterElem.parentNode;
  158.                 if (document.getElementById(vidId) == null) {
  159.                     navBar.insertItem(vidId, afterElem);
  160.                     navBar.setAttribute("currentset", navBar.currentSet);
  161.                     document.persist("nav-bar", "currentset");
  162.                 }
  163.             }
  164.         } catch (e) {
  165.             com.VidBar.__e("com.VidBar.UI.install: " + e);
  166.         }
  167.     },
  168.     enableButton : function(button) {
  169.         button.setAttribute("disabled", "false");
  170.         if (this.pref.getIconStyle() == "3D") {
  171.             button.setAttribute("class", "on");
  172.         } else {
  173.             button.setAttribute("class", "on-noanim");
  174.         }
  175.     },
  176.     enableVidButton : function() {
  177.         this.enableButton(this.toolbarDownloadButton);
  178.         this.enableButton(this.navToolbarButton);
  179. //        this.enableButton(this.statusbarButton);
  180.     },
  181.     disableButton : function(button) {
  182.         button.setAttribute("disabled", "true");
  183.         button.setAttribute("class", "off");
  184.     },
  185.     disableVidButton : function() {
  186.         this.disableButton(this.toolbarDownloadButton);
  187.         this.disableButton(this.navToolbarButton);
  188. //        this.disableButton(this.statusbarButton);
  189.     },
  190.     clearMenu : function(menupopup) {
  191.         while (menupopup.firstChild) {
  192.             menupopup.removeChild(menupopup.firstChild);
  193.         }
  194.     },
  195.     generateSystemMenu : function(menupopup) {
  196.         var doc = menupopup.ownerDocument;
  197.         var _this = this;
  198.         var menuitem;
  199.         menuitem = doc.createElement("menuitem");
  200.         menuitem.setAttribute("label", "Preferences");
  201.         menuitem.setAttribute("image", "chrome://vidbar/skin/preferences.png");
  202.         menuitem.setAttribute("class", "menuitem-iconic");
  203.         menuitem.addEventListener("command", function() {
  204.                     com.VidBar.UI.preferences();
  205.                 }, false);
  206.         menupopup.appendChild(menuitem);
  207.  
  208. //        menuitem = doc.createElement("menuitem");
  209. //        menuitem.setAttribute("label", "Supported Sites");
  210. //        menuitem.addEventListener("command", function() {
  211. //                    com.VidBar.UI.openSites();
  212. //                }, false);
  213. //        menupopup.appendChild(menuitem);
  214.  
  215.         menuitem = doc.createElement("menuitem");
  216.         menuitem.setAttribute("label", "Downloads");
  217.         menuitem.setAttribute("image", "chrome://vidbar/skin/downloads.gif");
  218.         menuitem.setAttribute("class", "menuitem-iconic");
  219.         menuitem.addEventListener("command", function() {
  220.                     com.VidBar.UI.openDownloadQueue();
  221.                 }, false);
  222.         menupopup.appendChild(menuitem);
  223.  
  224.         menuitem = doc.createElement("menuitem");
  225.         menuitem.setAttribute("label", "Open Download Folder");
  226.         menuitem.setAttribute("image", "chrome://vidbar/skin/open_download_folder.gif");
  227.         menuitem.setAttribute("class", "menuitem-iconic");
  228.         menuitem.addEventListener("command", function() {
  229.                     com.VidBar.UI.openDownloadDir();
  230.                 }, false);
  231.         menupopup.appendChild(menuitem);
  232.  
  233.         menuitem = doc.createElement("menuitem");
  234.         menuitem.setAttribute("label", "Help");
  235.         menuitem.setAttribute("image", "chrome://vidbar/skin/help2.gif");
  236.         menuitem.setAttribute("class", "menuitem-iconic");
  237.         menuitem.addEventListener("command", function() {
  238.                     com.VidBar.UI.help();
  239.                 }, false);
  240.         menupopup.appendChild(menuitem);
  241.  
  242.         menuitem = doc.createElement("menuseparator");
  243.         menupopup.appendChild(menuitem);
  244.  
  245.         menuitem = doc.createElement("menuitem");
  246.         menuitem.setAttribute("label", "About");
  247.         menuitem.setAttribute("image", "chrome://vidbar/skin/about-logo-16.gif");
  248.         menuitem.setAttribute("class", "menuitem-iconic");
  249.         menuitem.addEventListener("command", function() {
  250.                     com.VidBar.UI.about();
  251.                 }, false);
  252.         menupopup.appendChild(menuitem);
  253.     },
  254.     about : function() {
  255.         com.VidBar.__d("com.VidBar.UI.about");
  256.         var options = "chrome,centerscreen,modal";
  257.         window.openDialog("chrome://vidbar/content/about.xul", "vidbar-dialog",
  258.                 options, {});
  259.     },
  260.     openHome : function(){
  261.         com.VidBar.__d("com.VidBar.UI.openHome");
  262.         this.openURLInNewTab("http://ffpimp.com/");
  263.     },
  264.     openInbox : function(){
  265.         com.VidBar.__d("com.VidBar.UI.openInbox");
  266.         var url = this.pref.getInboxUrl();
  267.         if(!url){
  268.             alert("Inbox URL is not set. Please set it in Preferences.");
  269.             this.preferences();
  270.             return;
  271.         }
  272.         this.openURLInNewTab(url);
  273.     },
  274.     openTranslate : function(){
  275.         com.VidBar.__d("com.VidBar.UI.openTranslate");
  276.         var urlTranslate = this.getCurrentDoc();
  277.         var url = "http://www.microsofttranslator.com/BV.aspx?ref=zugo&from=&to=en&a=" + encodeURIComponent(urlTranslate.URL);
  278.         this.openURLInNewTab(url);
  279.     },
  280.     openStumble : function(){
  281.         com.VidBar.__d("com.VidBar.UI.openStumble");        
  282.         var url="http://www.stumbleupon.com/s/";
  283.         this.openURLInNewTab(url);
  284.     },
  285.     openFacebook : function(){
  286.         com.VidBar.__d("com.VidBar.UI.openFacebook");
  287.         this.openURLInNewTab("http://www.facebook.com/");
  288.     },
  289.     searchBing : function(){
  290.         com.VidBar.__d("com.VidBar.UI.searchBing");
  291.         var keyword=document.getElementById("vidbar-search-box").value;
  292.         var url="http://bing.zugotoolbar.com/s/?q="+encodeURIComponent(keyword)+"&site=Bing&pid=87";
  293.         this.openURLInNewTab(url);
  294.     },
  295.     searchBingVideo : function(){
  296.         com.VidBar.__d("com.VidBar.UI.searchBingVideo");
  297.         var keyword=document.getElementById("vidbar-search-box").value;
  298.         var url="http://bing.zugotoolbar.com/s/?q="+encodeURIComponent(keyword)+"&site=Bing&pid=87&engine=video";
  299.         this.openURLInNewTab(url);
  300.     },
  301.     onSearchBoxKeyPressed : function(event) {
  302.         if (event.keyCode == event.DOM_VK_RETURN) {
  303.             this.searchBing();
  304.         }
  305.     },
  306.     help : function() {
  307.         com.VidBar.__d("com.VidBar.UI.help");
  308.         content.location.href = "http://vids.st/help/";
  309.     },
  310.     preferences : function() {
  311.         com.VidBar.__d("com.VidBar.UI.preferences");
  312.         var options = "chrome,centerscreen,modal";
  313.         window.openDialog("chrome://vidbar/content/preferences.xul", "vidbar-dialog",
  314.                 options, {});
  315.  
  316.     },
  317.     openSites : function() {
  318.         com.VidBar.__d("com.VidBar.UI.openSites");
  319.         var w = window.open("chrome://vidbar/content/sites.xul", "vidbar-sites",
  320.                 "chrome,centerscreen,resizable=yes");
  321.         w.focus();
  322.     },
  323.     openDownloadQueue : function() {
  324.         com.VidBar.__d("com.VidBar.UI.openDownloadQueue");
  325.         var w = window.open("chrome://vidbar/content/queue.xul",
  326.                 "vidbar-download-queue", "chrome,centerscreen,resizable=yes");
  327.         w.focus();
  328.     },
  329.     openDownloadDir : function() {
  330.         com.VidBar.__d("com.VidBar.UI.openDownloadDir");
  331.         try {
  332.             var dir = this.pref.getDownloadDirectory()
  333.                     .QueryInterface(Components.interfaces.nsILocalFile);
  334.             dir.reveal();
  335.         } catch (e) {
  336.             com.VidBar.__e("com.VidBar.UI.openDownloadDir: " + e);
  337.         }
  338.     },
  339.     openURLInNewTab : function(url) {
  340.         com.VidBar.__d("com.VidBar.UI.openURLInNewTab");
  341.         var browser = window.getBrowser();
  342.         var tab = browser.addTab(url);
  343.  
  344.         setTimeout(function(b, t) {
  345.                     b.selectedTab = t;
  346.                 }, 0, browser, tab);
  347.     },
  348.     getCurrentDoc : function() {
  349.         var browser = gBrowser
  350.                 .getBrowserAtIndex(gBrowser.mTabContainer.selectedIndex);
  351.         return browser.contentDocument;
  352.     },
  353.     isCurrentDoc : function(doc) {
  354.         return doc == this.getCurrentDoc();
  355.     },
  356.     update : function(rep, doc) {
  357.         if (!doc)
  358.             doc = this.getCurrentDoc();
  359.         else if (!this.isCurrentDoc(doc))
  360.             return;
  361.  
  362.         this.updateMenu(rep, doc);
  363.     },
  364.     updateMenu : function(rep, doc) {
  365.         com.VidBar.__d("com.VidBar.UI.updateMenu");
  366.         var mediaList = rep.getMediaListByDoc(doc);
  367.  
  368.         try {
  369.             this.updateMediaMenu(this.toolbarDownloadMenu, mediaList);
  370.             this.updateMediaMenu(this.navToolbarDownloadMenu, mediaList);
  371. //            this.updateMediaMenu(this.statusbarMenu, mediaList);
  372.             this.updateMediaMenu(this.contextMenu, mediaList, true);
  373.  
  374.             if (mediaList.length == 0) {
  375.                 this.disableVidButton();
  376.             } else {
  377.                 this.enableVidButton();
  378.             }
  379.         } catch (e) {
  380.             com.VidBar.__e("com.VidBar.UI.updateMenu: " + e);
  381.         }
  382.     },
  383.     updateMediaMenu : function(menu, mediaList, checkSep) {
  384.         var doc = menu.ownerDocument;
  385.  
  386.         if (checkSep) {
  387.             var sep = doc.getElementById("VidCtxMediaSep");
  388.             if (mediaList.length > 0) {
  389.                 if (sep == null) {
  390.                     var menusep = doc.createElement("menuseparator");
  391.                     menusep.setAttribute("id", "VidCtxMediaSep");
  392.                     menu.appendChild(menusep);
  393.                 }
  394.             } else {
  395.                 if (sep != null) {
  396.                     menu.removeChild(sep);
  397.                 }
  398.             }
  399.         }
  400.  
  401.         var items = [];
  402.         for (var i = 0; i < mediaList.length; i++) {
  403.             var media = mediaList[i];
  404.             var menuitem = null;
  405.             for (var j = 0; j < menu.childNodes.length; j++) {
  406.                 var node = menu.childNodes[j];
  407.                 if (node && node.nodeName == "menuitem" && node.mediaData) {
  408.                     if (node.mediaData.guid == media.guid) {
  409.                         menuitem = node;
  410.                         break;
  411.                     }
  412.                 }
  413.             }
  414.             var label = media.label;
  415.             if (label.length > 60) {
  416.                 var dp = label.lastIndexOf(".");
  417.                 var ext = label.substr(dp);
  418.                 label = label.substr(0, 60 - ext.length - 2) + ".." + ext;
  419.             }
  420.             if (media.size) {
  421.                 label += " - " + VidUtils.getSizeStr(media.size);
  422.             }
  423.  
  424.             if (menuitem) {
  425.                 menuitem.setAttribute("label", label);
  426. //                menuitem.setAttribute("image", "chrome://vidbar/skin/"
  427. //                                + media.type + ".gif");
  428.                 this.updateMenuItemTooltip(doc, "tip-" + media.guid, media);
  429.                 menuitem.mediaData = media;
  430.             } else {
  431.                 menuitem = doc.createElement("menuitem");
  432.                 menuitem.setAttribute("label", label);
  433. //                menuitem.setAttribute("image", "chrome://vidbar/skin/"
  434. //                                + media.type + ".gif");
  435.                 menuitem.setAttribute("image", "chrome://vidbar/skin/vid16-on.png");
  436.                 var ttid = this.createMenuItemTooltip(doc, media);
  437.                 menuitem.setAttribute("tooltip", ttid);
  438.                 menuitem.setAttribute("class", "menuitem-iconic");
  439.                 var _this = this;
  440.                 menuitem.addEventListener("command", function(event) {
  441.                             _this.menuItemClicked(event);
  442.                         }, true);
  443.                 menuitem.mediaData = media;
  444.                 
  445.                 
  446.                 // Create context menu            
  447.             var popup = doc.createElement("popup");
  448.             popup.setAttribute("id", "popup-menu");
  449.             var menupopupitem = doc.createElement("menuitem");
  450.             menupopupitem.setAttribute("label", " Save Video As..");
  451.             menupopupitem.setAttribute("class", "menuitem-iconic");
  452.             menupopupitem.mediaData = media;
  453.             menupopupitem.addEventListener("command", function(event) {
  454.                             _this.menuPopupItemClicked(event);}, true);
  455.             popup.appendChild(menupopupitem);            
  456.             doc.documentElement.appendChild(popup);
  457.             menuitem.setAttribute("context", "popup-menu");            
  458.             menu.setAttribute("context", "popup-menu");
  459.                             
  460.                 menu.appendChild(menuitem);
  461.             }
  462.             var statusDisplay = VidUtils.getDownloadStatusDisplay(media.status);
  463.             menuitem.setAttribute("style", statusDisplay[1]);
  464.             items.push(menuitem);
  465.         }
  466.         for (var j = 0; j < menu.childNodes.length; j++) {
  467.             var node = menu.childNodes[j];
  468.             if (!node.mediaData)
  469.                 continue;
  470.  
  471.             var has = false;
  472.             for (var i = 0; i < items.length; i++) {
  473.                 if (items[i] == node) {
  474.                     has = true;
  475.                     break;
  476.                 }
  477.             }
  478.             if (!has) {
  479.                 menu.removeChild(node);
  480.                 var tooltip = document.getElementById("tip-"
  481.                         + node.mediaData.guid);
  482.                 if (tooltip) {
  483.                     tooltip.parentNode.removeChild(tooltip);
  484.                 }
  485.             }
  486.         }
  487.     },
  488.     createMenuItemTooltip : function(doc, media) {
  489.         var tooltip = doc.createElement("tooltip");
  490.         var ttid = "tip-" + media.guid;
  491.         tooltip.setAttribute("id", ttid);
  492.         this.updateMenuItemTooltip(doc, ttid, media);
  493.         doc.documentElement.appendChild(tooltip);
  494.         return ttid;
  495.     },
  496.     updateMenuItemTooltip : function(doc, ttid, media) {
  497.         var tooltip = doc.getElementById(ttid);
  498.         if (!tooltip)
  499.             return;
  500.  
  501.         while (tooltip.firstChild) {
  502.             tooltip.removeChild(tooltip.firstChild);
  503.         }
  504.  
  505.         var statusDisplay = VidUtils.getDownloadStatusDisplay(media.status);
  506.  
  507.         var label;
  508.         label = doc.createElement("label");
  509.         label.setAttribute("value", media.label);
  510.         label.setAttribute("style", "font-weight:bold;" + statusDisplay[1]);
  511.         tooltip.appendChild(label);
  512.  
  513.         label = doc.createElement("label");
  514.         label.setAttribute("value", "URL: " + media.mediaUrl);
  515.         tooltip.appendChild(label);
  516.  
  517.         label = doc.createElement("label");
  518.         label.setAttribute("value", "Page: " + media.pageUrl);
  519.         tooltip.appendChild(label);
  520.  
  521.         label = doc.createElement("label");
  522.         label.setAttribute("value", "Size: " + VidUtils.getSizeStr(media.size));
  523.         tooltip.appendChild(label);
  524.  
  525.         if (media.status) {
  526.             label = doc.createElement("label");
  527.             label.setAttribute("value", "Status: " + statusDisplay[0]);
  528.             tooltip.appendChild(label);
  529.  
  530.             if (media.status == VidStatus.DOWNLOADING
  531.                     || media.status == VidStatus.PAUSED) {
  532.                 if (media.percentComplete && media.percentComplete >= 0) {
  533.                     label = doc.createElement("label");
  534.                     label.setAttribute("value", "Percent Complete: "
  535.                                     + media.percentComplete + "%");
  536.                     tooltip.appendChild(label);
  537.                 }
  538.  
  539.                 if (media.amountTransferred) {
  540.                     label = doc.createElement("label");
  541.                     label
  542.                             .setAttribute(
  543.                                     "value",
  544.                                     "Downloaded Size: "
  545.                                             + VidUtils
  546.                                                     .getSizeStr(media.amountTransferred));
  547.                     tooltip.appendChild(label);
  548.                 }
  549.                 if (media.status == VidStatus.DOWNLOADING && media.speed) {
  550.                     label = doc.createElement("label");
  551.                     label
  552.                             .setAttribute("value", "Speed: "
  553.                                             + VidUtils.getSizeStr(media.speed)
  554.                                             + "/sec");
  555.                     tooltip.appendChild(label);
  556.                 }
  557.             }
  558.         }
  559.     },
  560.     menuItemClicked : function(e) {
  561.         com.VidBar.__d("com.VidBar.UI.menuItemClicked");
  562.         if (e.originalTarget.nodeName == "menuitem") {
  563.             var data = e.originalTarget.mediaData;
  564.             if (data) {
  565.                 // com.VidBar.__d("menu item clicked: " + data.filename);
  566.                 switch (data.status) {
  567.                     case VidStatus.NOTDOWNLOADED :
  568.                         com.VidBar.VidDownloader.queueDownload(data);
  569.                         break;
  570.                     case VidStatus.ENQUEUED :
  571.                     case VidStatus.DOWNLOADING :
  572.                         break;
  573.                     case VidStatus.COMPLETE :
  574.                         // TODO: open video or dir
  575.                         break;
  576.                     case VidStatus.FAILED :
  577.                         // TODO: prompt for retry
  578.                         break;
  579.                     case VidStatus.CANCELLED :
  580.                         // TODO: prompt for redownload
  581.                         break;
  582.                     case VidStatus.PAUSED :
  583.                         // TODO: prompt for conintue
  584.                         break;
  585.                     case VidStatus.QUEUED :
  586.                         break;
  587.                     case VidStatus.BLOCKED :
  588.                     case VidStatus.SCANNING :
  589.                     default :
  590.                         break;
  591.                 }
  592.             }
  593.         }
  594.     },
  595.     menuPopupItemClicked : function(e) {
  596.         com.VidBar.__d("com.VidBar.UI.menuPopupItemClicked");
  597.         if (e.originalTarget.nodeName == "menuitem") {
  598.             var data = e.originalTarget.mediaData;
  599.             if (data) {
  600.                 netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
  601.                 netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");
  602.                 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 
  603.                 var nsIFilePicker = Components.interfaces.nsIFilePicker;
  604.                 var nsILocalFile = Components.interfaces.nsILocalFile;
  605.                 nsILocalFile = this.pref.getDownloadDirectory();
  606.                 var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  607.                 fp.init(window, " Save Video As..", nsIFilePicker.modeSave);
  608.                 var tempFilename = data.filename.substring(0, data.filename.length-4);
  609.                 fp.defaultString = tempFilename;
  610.                 fp.displayDirectory = nsILocalFile;
  611.                 fp.appendFilter("Video files (*.flv)", "*.flv");
  612.                 var rv = fp.show();
  613.                 if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {                    
  614.                     data.filename = fp.file.leafName +'.'+ data.extension;
  615.                     data.dir = fp.displayDirectory.path;                
  616.                     com.VidBar.VidDownloader.queueDownload(data);
  617.                 }
  618.                     
  619.             }
  620.         }
  621.     },
  622.     updateContextMenu : function() {
  623.         com.VidBar.__d("com.VidBar.UI.updateContextMenu");
  624.         var show = this.pref.isContextMenuShown();
  625.         document.getElementById("vidbar-ctxmenu").setAttribute("hidden",
  626.                 "" + !show);
  627.     },
  628.     updateLayout : function() {
  629.         com.VidBar.__d("com.VidBar.UI.updateLayout");
  630.         var layout = this.pref.getLayoutType();
  631.         com.VidBar.__d("layout: "+layout);
  632.         document.getElementById("vidbtn-toolbaritem").setAttribute("hidden",
  633.                 "" + layout == "toolbar");
  634.         document.getElementById("vidbar-toolbar").setAttribute("hidden",
  635.                 "" + layout == "button");
  636.     },
  637.     updateIconPos : function() {
  638.         com.VidBar.__d("com.VidBar.UI.updateIconPos");
  639.         var pos = this.pref.getIconPos();
  640. //        document.getElementById("vidbar-statusbarpanel").setAttribute("hidden",
  641. //                "" + pos == "toolbar");
  642.         document.getElementById("vidbar-toolbaritem").setAttribute("hidden",
  643.                 "" + pos == "statusbar");
  644.     },
  645.     autoFill : function(){
  646.         this.autofill.autoFill();
  647.     },
  648.     editAutofillProfile : function(){
  649.         this.autofill.editProfile();
  650.     }
  651. };
  652.  
  653. com.VidBar.Repository = {
  654.     list : [],
  655.     observers : [],
  656.     processors : [],
  657.     init : function() {
  658.         com.VidBar.__d("com.VidBar.Repository.init");
  659.     },
  660.     addObserver : function(ob) {
  661.         this.observers.push(ob);
  662.     },
  663.     getTopDoc : function(doc) {
  664.         if (doc && doc.defaultView && doc.defaultView.top)
  665.             return doc.defaultView.top.document;
  666.         else
  667.             return null;
  668.     },
  669.     update : function(doc) {
  670.         com.VidBar.__d("com.VidBar.Repository.update");
  671.         doc = this.getTopDoc(doc);
  672.         if (doc) {
  673.             for (var i = 0; i < this.observers.length; i++) {
  674.                 if (this.observers[i]) {
  675.                     this.observers[i].update(this, doc);
  676.                 }
  677.             }
  678.         }
  679.     },
  680.     addMediaListByDoc : function(list, doc) {
  681.         com.VidBar.__d("com.VidBar.Repository.addMediaListByDoc");
  682.         if (list.length > 0) {
  683.             doc = this.getTopDoc(doc);
  684.             if (!doc || !doc.URL)
  685.                 return;
  686.             com.VidBar.__d("com.VidBar.Repository.addMediaListByDoc\ndoc: " + doc.URL
  687.                     + "\nlist length: " + list.length);
  688.             var mediaList = this.getMediaListByDoc(doc);
  689.             for (var i = 0; i < list.length; i++) 
  690.             {
  691.                 if (list[i] == null || typeof(list[i]) == "undefined")
  692.                     continue;
  693.                     
  694.                 var found = false;
  695.                 for (var j = 0; j < mediaList.length; j++) {
  696.                     if (mediaList[j].mediaUrl == list[i].mediaUrl) {
  697.                         for (var a in list[i]) {
  698.                             mediaList[j][a] = list[i][a];
  699.                         }
  700.                         found = true;
  701.                         break;
  702.                     }
  703.                 }
  704.                 if (!found) {
  705.                     list[i].doc = doc;
  706.                     list[i].guid = VidUtils.generateGuid();
  707.                     list[i].status = VidStatus.NOTDOWNLOADED;
  708.                     
  709.                     this.list.push(list[i]);
  710.                 }
  711.             }
  712.             this.update(doc);
  713.         }
  714.     },
  715.     getMediaListByDoc : function(doc) {
  716.         com.VidBar.__d("com.VidBar.Repository.getMediaListByDoc: - doc: " + doc.URL);
  717.         var list = [];
  718.         doc = this.getTopDoc(doc);
  719.         if (!doc)
  720.             return list;
  721.  
  722.         for (var i = 0; i < this.list.length; i++) {
  723.             if (this.list[i].doc == doc)
  724.                 list.push(this.list[i]);
  725.         }
  726.         // com.VidBar.__d("com.VidBar.Repository.getMediaListByDoc\ndoc: " + doc.URL + "\nlist
  727.         // length: " + list.length);
  728.         return list;
  729.     },
  730.     removeMediaByDoc : function(doc) {
  731.         com.VidBar.__d("com.VidBar.Repository.removeMediaByDoc");
  732.         var list = [];
  733.         doc = this.getTopDoc(doc);
  734.         if (!doc)
  735.             return;
  736.  
  737.         for (var i = 0; i < this.list.length; i++) {
  738.             if (this.list[i].doc != doc)
  739.                 list.push(this.list[i]);
  740.         }
  741.         // com.VidBar.__d("com.VidBar.Repository.removeMediaByDoc\ndoc: " + doc.URL + "\nold list
  742.         // length: " + this.list.length + "\nnew list length: " + list.length);
  743.         this.list = list;
  744.         this.update(doc);
  745.     },
  746.     updateMediaByGuid : function(guid, data) {
  747.         com.VidBar.__d("com.VidBar.Repository.updateMediaByGuid");
  748.         var media = this.getMediaByGuid(guid);
  749.         if (media) {
  750.             for (var i in data) {
  751.                 if (i != "doc")
  752.                     media[i] = data[i];
  753.             }
  754.             if (media.doc) {
  755.                 this.update(media.doc);
  756.             }
  757.         }
  758.     },
  759.     getMediaByGuid : function(guid) {
  760.         com.VidBar.__d("com.VidBar.Repository.getMediaByGuid");
  761.         var media = null;
  762.         for (var i = 0; i < this.list.length; i++) {
  763.             if (this.list[i].guid == guid) {
  764.                 media = this.list[i];
  765.             }
  766.         }
  767.         return media;
  768.     }
  769. };
  770.  
  771. com.VidBar.VidDownloader = {
  772.     onDownloadStateChange : function(aState, aDownload) {
  773.     },
  774.     onStateChange : function(webProgress, request, stateFlags, status,
  775.             aDownload) {
  776.         var entry = this.db.getDownloadingById(aDownload.id);
  777.         if (entry) {
  778.             if (stateFlags
  779.                     & Components.interfaces.nsIWebProgressListener.STATE_STOP) {
  780.                 
  781.                 if (aDownload.state == Components.interfaces.nsIDownloadManager.DOWNLOAD_FINISHED){
  782.                     this.transferDone(entry, aDownload);
  783.                 } else {
  784.                     this.updateDownloadStatus(entry, VidStatus.translateState(aDownload.state));
  785.                 }
  786.             } else {
  787.                 this.updateDownloadStatus(entry, VidStatus.DOWNLOADING);
  788.             }
  789.         }
  790.     },
  791.     onProgressChange : function(webProgress, request, curSelfProgress,
  792.             maxSelfProgress, curTotalProgress, maxTotalProgress, aDownload) {
  793.         var entry = this.db.getDownloadingById(aDownload.id);
  794.         if (entry) {
  795.             this.updateDownloadProgress(entry, aDownload);
  796.         }
  797.     },
  798.     onStatusChange : function(webProgress, request, status, message, aDownload) {
  799.     },
  800.     onLocationChange : function(webProgress, request, location, aDownload) {
  801.     },
  802.     onSecurityChange : function(webProgress, request, state, aDownload) {
  803.     },
  804.     init : function(pref, repository) {
  805.         com.VidBar.__d("com.VidBar.VidDownloader.init");
  806.         try {
  807.             this.pref = pref;
  808.             this.pref.registerObserver(["max-downloads"], this);
  809.             this.repository = repository;
  810.             this.db = new com.VidBar.VidDB();
  811.             this.db.checkDBFormat();
  812.             setTimeout(function(){
  813.                 com.VidBar.VidDownloader.initDownloadManager();
  814.             }, 0);
  815.         } catch (e) {
  816.             com.VidBar.__e("com.VidBar.VidDownloader.init: " + e);
  817.         }
  818.     },
  819.     initDownloadManager : function(){
  820.         com.VidBar.__d("com.VidBar.VidDownloader.initDownloadManager");
  821.         try{
  822. //            this.dlMgr = gDownloadManager;
  823.             this.dlMgr = Components.classes["@mozilla.org/download-manager;1"]
  824.                     .getService(Components.interfaces.nsIDownloadManager);
  825.             this.dlMgr.addListener(this);
  826.             this.syncDownloads();
  827.             this.checkDownloads();
  828.             this.checkDownloadQueue();
  829.         }catch(ex){
  830.             com.VidBar.__e("com.VidBar.VidDownloader.initDownloadManager: " + e);
  831.         }
  832.     },
  833.     close : function() {
  834.         this.dlMgr.removeListener(this);
  835.     },
  836.     observePref : function(data) {
  837.         if (data == "max-downloads")
  838.             this.checkDownloadQueue();
  839.     },
  840.     checkDownloads : function() {
  841.     },
  842.     queueDownload : function(data) {
  843.         com.VidBar.__d("com.VidBar.VidDownloader.queueDownload");
  844.         try {
  845.             var entry = {
  846.                 guid : data.guid,
  847.                 filename : data.filename,
  848.                 dir : data.dir,
  849.                 mediaUrl : data.mediaUrl,
  850.                 referrer : data.referrer,
  851.                 size : data.size,
  852.                 status : VidStatus.QUEUED
  853.             };
  854.  
  855.             this.repository.updateMediaByGuid(data.guid, {
  856.                         status : VidStatus.QUEUED
  857.                     });
  858.  
  859.             this.db.addWaiting(data.guid, data.mediaUrl, data.filename, data.dir,
  860.                     data.referrer || "", data.size || 0);
  861.             var _this = this;
  862.             setTimeout(function() {
  863.                         _this.checkDownloadQueue();
  864.                     }, 0);
  865.         } catch (e) {
  866.             com.VidBar.__e("com.VidBar.VidDownloader.queueDownload: " + e);
  867.         }
  868.     },
  869.     checkDownloadQueue : function() {
  870.         com.VidBar.__d("com.VidBar.VidDownloader.checkDownloadQueue");
  871.         try {
  872.             var candicates = [];
  873.             var pendingQueue = this.db.getWaitings();
  874.             var downloadingLen = this.db.getDownloadingLength();
  875.             var downloadLimit = this.pref.getMaxDownload();
  876.             var amount = downloadLimit == 0
  877.                     ? pendingQueue.length
  878.                     : downloadLimit - downloadingLen;
  879.             for (var i = 0; i < amount; i++) {
  880.                 if (pendingQueue.length > 0) {
  881.                     var entry = pendingQueue.shift();
  882.                     candicates.push(entry);
  883.                 }
  884.             }
  885.             for (var i = 0; i < candicates.length; i++) {
  886.                 this.doDownload(candicates[i]);
  887.             }
  888.         } catch (e) {
  889.             com.VidBar.__e("com.VidBar.VidDownloader.checkDownloadQueue: " + e);
  890.         }
  891.     },
  892.     doDownload : function(entry) {
  893.         com.VidBar.__d("com.VidBar.VidDownloader.doDownload");
  894.         try {
  895.             var dwDir = this.pref.getDownloadDirectory();
  896.             if (!dwDir.exists()) {
  897.                 dwDir
  898.                         .create(Components.interfaces.nsIFile.DIRECTORY_TYPE,
  899.                                 0775);
  900.             }
  901.  
  902.             var filename = entry.filename;
  903.             if (filename == null) {
  904.                 filename = "video.flv";
  905.             }
  906.             var dir = Components.classes["@mozilla.org/file/local;1"]
  907.             .createInstance(Components.interfaces.nsILocalFile);
  908.             
  909.             var file;
  910.             if (entry.dir == "") {
  911.                 file = dwDir.clone();
  912.             }
  913.             else {
  914.                 dir.initWithPath(entry.dir);
  915.                 file = dir.clone();                
  916.             }
  917.             file.append(filename);
  918.             file.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE,
  919.                     0644);
  920.             var targetURI = makeFileURI(file);
  921.  
  922.             var sourceURI = Components.classes["@mozilla.org/network/standard-url;1"]
  923.                     .createInstance(Components.interfaces.nsIURI);
  924.             sourceURI.spec = entry.mediaUrl;
  925.  
  926.             var referrerURI = null;
  927.             if (entry.referrer) {
  928.                 referrerURI = Components.classes["@mozilla.org/network/standard-url;1"]
  929.                         .createInstance(Components.interfaces.nsIURI);
  930.                 referrerURI.spec = entry.referrer;
  931.             }
  932.  
  933.             // TODO
  934.             var shouldBypassCache = false;
  935.  
  936.             var persist = makeWebBrowserPersist();
  937.  
  938.             const nsIWBP = Components.interfaces.nsIWebBrowserPersist;
  939.             const flags = nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
  940.             if (shouldBypassCache)
  941.                 persist.persistFlags = flags
  942.                         | nsIWBP.PERSIST_FLAGS_BYPASS_CACHE;
  943.             else
  944.                 persist.persistFlags = flags | nsIWBP.PERSIST_FLAGS_FROM_CACHE;
  945.             persist.persistFlags |= nsIWBP.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
  946.  
  947.             var download = this.dlMgr
  948.                     .addDownload(
  949.                             Components.interfaces.nsIDownloadManager.DOWNLOAD_TYPE_DOWNLOAD,
  950.                             sourceURI, targetURI, "", null, null, null, persist);
  951.  
  952.             this.db.addDownloading(entry.guid, entry.mediaUrl, entry.filename, entry.dir,
  953.                     entry.referrer, entry.size, VidStatus.DOWNLOADING,
  954.                     download.id);
  955.             this.db.removeWaiting(entry.guid);
  956.  
  957.             persist.progressListener = download;
  958.  
  959.             persist
  960.                     .saveURI(sourceURI, null, referrerURI, null, null,
  961.                             targetURI);
  962.  
  963.             this.repository.updateMediaByGuid(entry.guid, {
  964.                         status : VidStatus.DOWNLOADING
  965.                     });
  966.         } catch (e) {
  967.             com.VidBar.__e("com.VidBar.VidDownloader.doDownload: " + e);
  968.         }
  969.     },
  970.     updateDownloadProgress : function(entry, download) {
  971.         com.VidBar.__d("com.VidBar.VidDownloader.updateDownloadProgress");
  972.         var update = {
  973.             percentComplete : download.percentComplete,
  974.             size : download.size,
  975.             amountTransferred : download.amountTransferred,
  976.             startTime : new Date(download.startTime / 1000),
  977.             speed : download.speed
  978.         };
  979.         this.db.updateDownloadingProgress(entry.guid, download.size,
  980.                 download.percentComplete, download.amountTransferred,
  981.                 download.speed);
  982.         for (var p in update) {
  983.             entry[p] = update[p];
  984.         }
  985.         this.repository.updateMediaByGuid(entry.guid, update);
  986.     },
  987.     updateDownloadStatus : function(entry, downloadStatus) {
  988.         com.VidBar.__d("com.VidBar.VidDownloader.updateDownloadStatus");
  989.         entry.status = downloadStatus;
  990.         this.db.updateDownloadingStatus(entry.guid, downloadStatus);
  991.         this.repository.updateMediaByGuid(entry.guid, {
  992.                     status : downloadStatus
  993.                 });
  994.     },
  995.     transferDone : function(entry, download) {
  996.         com.VidBar.__d("com.VidBar.VidDownloader.transferDone");
  997.         try {
  998.             this.repository.updateMediaByGuid(entry.guid, {
  999.                         status : VidStatus.translateState(download.state)
  1000.                     });
  1001.             this.updateDownloadProgress(entry, download);
  1002.             this.updateDownloadStatus(entry, VidStatus.COMPLETE);
  1003.             this.db.removeDownloading(entry.guid);
  1004.  
  1005.             com.VidBar.__d("com.VidBar.VidDownloader.transferDone: " + entry.filename + " is done.");
  1006.  
  1007.             var _this = this;
  1008.             setTimeout(function() {
  1009.                         _this.checkDownloadQueue();
  1010.                     }, 0);
  1011.         } catch (e) {
  1012.             com.VidBar.__e("com.VidBar.VidDownloader.transferDone: " + e);
  1013.         }
  1014.     },
  1015.     removeDownloads : function(entries) {
  1016.         com.VidBar.__d("com.VidBar.VidDownloader.removeDownloads");
  1017.     },
  1018.     syncDownloads : function(){
  1019.         com.VidBar.__d("com.VidBar.VidDownloader.syncDownloads");
  1020.         this.db.syncDownloads(this.dlMgr);
  1021.     },
  1022.     doCloseCheck : function(){
  1023.         com.VidBar.__d("com.VidBar.VidDownloader.doCloseCheck");
  1024.         var msg = null;
  1025.         var length = 0;
  1026.         var downloadings = this.db.getDownloadings();
  1027.         for (var i in downloadings){
  1028.             if(downloadings[i].status == VidStatus.DOWNLOADING) {
  1029.                 length++;
  1030.             }
  1031.         }
  1032.         if (length == 1) {
  1033.             msg = "There is still 1 video in downloading. Are you sure you want to stop it and close the browser?";
  1034.         } else if (length > 1) {
  1035.             msg = "There are still "
  1036.                     + length
  1037.                     + " videos in downloading. Are you sure you want to stop it and close the browser?";
  1038.         } else {
  1039.             var waitings = this.db.getWaitings();
  1040.             if (waitings.length == 1) {
  1041.                 msg = "There is still 1 video in queue. Are you sure you want to stop it and close the browser?";
  1042.             } else if (waitings.length > 1) {
  1043.                 msg = "There are still "
  1044.                         + waitings.length
  1045.                         + " videos in queue. Are you sure you want to stop it and close the browser?";
  1046.             }
  1047.         }
  1048.         var result = {cancel:false, clear:false};            
  1049.         if(msg){    
  1050.             window.openDialog("chrome://vidbar/content/exitdialog.xul", "",
  1051.             "chrome, dialog, modal, resizable=no, centerscreen=true", msg, result).focus();
  1052.         }
  1053.         return result;
  1054.     },
  1055.     cleanAll : function(){
  1056.         com.VidBar.__d("com.VidBar.VidDownloader.cleanAll");
  1057.         this.db.removeAllWaitings();
  1058.         var downloadings = this.db.getDownloadings();
  1059.         for(var i in downloadings){
  1060.             com.VidBar.__d("downloadId: "+downloadings[i].downloadId);
  1061.             try{
  1062.                 this.dlMgr.cancelDownload(downloadings[i].downloadId);
  1063.             }catch(ex){
  1064.                 com.VidBar.__e("com.VidBar.VidDownloader.cleanAll: " + ex);
  1065.             }
  1066.             try{
  1067.                 this.dlMgr.removeDownload(downloadings[i].downloadId);
  1068.             }catch(ex){
  1069.                 com.VidBar.__e("com.VidBar.VidDownloader.cleanAll: " + ex);
  1070.             }
  1071.         }
  1072.         this.db.removeAllDownloadings();
  1073.     }
  1074. };
  1075.  
  1076. com.VidBar.Main = {
  1077.     analyzers : {},
  1078.     netMonitor : null,
  1079.  
  1080.     init : function() {
  1081.         com.VidBar.__d("com.VidBar.Main.init");
  1082.         this.analyzers = {
  1083.             "youtube" : new com.VidBar.YouTubeAnalyzer(com.VidBar.Pref),
  1084.             "medialink" : new com.VidBar.LinkAnalyzer(com.VidBar.Pref)
  1085.         }
  1086.  
  1087.         this.netMonitor = new com.VidBar.NetMonitor(com.VidBar.Repository, com.VidBar.Pref);
  1088.  
  1089.         var container = gBrowser.mPanelContainer;
  1090.         container.addEventListener("select", function(event) {
  1091.                     com.VidBar.Main.onTabSelected(event);
  1092.                 }, false);
  1093.         window.addEventListener("pageshow", function(event) {
  1094.                     com.VidBar.Main.onPageShow(event);
  1095.                 }, true);
  1096.         window.addEventListener("pagehide", function(event) {
  1097.                     com.VidBar.Main.onPageHide(event);
  1098.                 }, true);
  1099.     },
  1100.     onLoad : function(event) {
  1101.         com.VidBar.__d("com.VidBar.Main.onLoad");
  1102.         com.VidBar.Observer.register();
  1103.         com.VidBar.Pref.init();
  1104.         com.VidBar.UI.init(com.VidBar.Pref);
  1105.         com.VidBar.Repository.init();
  1106.         com.VidBar.VidDownloader.init(com.VidBar.Pref, com.VidBar.Repository);
  1107.         com.VidBar.Main.init();
  1108.         com.VidBar.Repository.addObserver(com.VidBar.UI);
  1109.         com.VidBar.VidFB.init(com.VidBar.Pref);
  1110.         com.VidBar.Main.checkFirstStart();
  1111.         
  1112.     },
  1113.     onClose : function(event) {
  1114.         com.VidBar.__d("com.VidBar.Main.onClose");
  1115.         //com.VidBar.Pref.close();
  1116.         //com.VidBar.VidDownloader.close();
  1117.     },
  1118.     onPageShow : function(event) {
  1119.         com.VidBar.__d("com.VidBar.Main.onPageShow");
  1120.         var doc = event.originalTarget;
  1121.         if (doc instanceof HTMLDocument) {
  1122.             // com.VidBar.__d("com.VidBar.Main.onPageShow:\ndoc: " + doc.URL);
  1123.  
  1124.             var list = [];
  1125.             for (var i in this.analyzers) {
  1126.                 var analyzer = this.analyzers[i];
  1127.                 try {
  1128.                     list = list.concat(analyzer.analyzeDoc(doc));
  1129.                 } catch (e) {
  1130.                     com.VidBar.__e(analyzer.name + " error during analyzing document: "
  1131.                             + e);
  1132.                 }
  1133.             }
  1134.             com.VidBar.Repository.addMediaListByDoc(list, doc);
  1135.         }
  1136.     },
  1137.     onPageHide : function(event) {
  1138.         com.VidBar.__d("com.VidBar.Main.onPageHide");
  1139.         var doc = event.originalTarget;
  1140.         if (doc instanceof HTMLDocument) {
  1141.             // com.VidBar.__d("com.VidBar.Main.onPageHide: doc: " + doc.URL);
  1142.  
  1143.             com.VidBar.Repository.removeMediaByDoc(doc);
  1144.         }
  1145.     },
  1146.     onTabSelected : function(event) {
  1147.         com.VidBar.__d("com.VidBar.Main.onTabSelected");
  1148.         com.VidBar.UI.update(com.VidBar.Repository);
  1149.     },
  1150.     checkFirstStart : function() {        
  1151.         try {
  1152.             var isFirstStart = com.VidBar.Pref.isFirstTime();
  1153.             com.VidBar.__d("com.VidBar.Main.checkFirstStart: "+isFirstStart);
  1154.             com.VidBar.ServerPings.onInstall();            
  1155.             if (isFirstStart) {
  1156.                 com.VidBar.Pref.unsetFirstTime();
  1157.                 com.VidBar.ServerPings.onInstall();
  1158.                 var OSName = "Unknown OS";
  1159.                 if (navigator.appVersion.indexOf("Win") != -1)
  1160.                     OSName = "Windows";
  1161.                 if (navigator.appVersion.indexOf("Mac") != -1)
  1162.                     OSName = "MacOS";
  1163.                 if (navigator.appVersion.indexOf("X11") != -1)
  1164.                     OSName = "UNIX";
  1165.                 if (navigator.appVersion.indexOf("Linux") != -1)
  1166.                     OSName = "Linux";
  1167.  
  1168.                 if (OSName == "MacOS") {
  1169.                     var url = "http://vids.st/mac/success.html";
  1170.                     setTimeout(function() {
  1171.                                 com.VidBar.UI.openURLInNewTab(url);
  1172.                             }, 2);
  1173.                 } else
  1174.                 // if(OSName == "Windows")
  1175.                 {
  1176.                     var url = "http://vids.st/success.html";
  1177.                     setTimeout(function() {
  1178.                                 com.VidBar.UI.openURLInNewTab(url);
  1179.                             }, 2);
  1180.                 }
  1181.             }
  1182.         } catch (e) {
  1183.             com.VidBar.__e("com.VidBar.Main.checkFirstStart: " + e);
  1184.         }
  1185.     }    
  1186. };
  1187.